﻿// C. Great Sequence.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1642/C

对于正整数 x 而言，如果我们能把一个正整数序列分成若干对，使得每一对中的第一个数乘以 x 等于第二个数，那么这个正整数序列就叫做大序列。更正式地说，如果 n 是偶数，且存在大小为 n 的置换 p，使得对于每个 i（1≤i≤n2），ap2i-1⋅x=ap2i，则大小为 n 的序列 a 对于正整数 x 是很大的。

山姆有一个数列 a 和一个正整数 x。帮助他使这个数列变大：找出为使数列 a 变大而应添加到数列 x 中的正整数的最小可能个数。

输入
每个测试包含多个测试用例。第一行包含一个整数 t（1≤t≤20000）--测试用例数。测试用例说明如下。

每个测试用例的第一行包含两个整数 n、x（1≤n≤2⋅105，2≤x≤106）。

下一行包含 n 个整数 a1,a2,...,an（1≤ai≤109）。

保证所有测试用例的 n 之和不超过 2⋅105。

输出
为每个测试用例打印一个整数，即在 a 的末尾添加最小的整数个数，使其成为数字 x 的大序列。


InputCopy
4
4 4
1 16 4 4
6 2
1 2 2 2 4 7
5 3
5 2 3 5 15
9 10
10 10 10 20 1 100 200 2000 3
OutputCopy
0
2
3
3

注释
在第一个测试案例中，山姆很幸运，对于数字 4 来说，这个序列已经很不错了，因为你可以把它分成这样的对子：（1,4）、（4,16）。因此，我们可以添加 0 个数字。

在第二个测试案例中，可以在序列中加入数字 1 和 14，然后可以将所有 8 个整数分成这样的对子：（1,2）、（1,2）、（2,4）、（7,14）。不可能加入少于 2 个 整数来固定序列。

*/
#include <iostream>
#include <map>

using namespace std;


int T;
map<long long, int> mm;

void solve() {
	int n, x;
	cin >> n >> x;
	for (int i = 0; i < n; i++) {
		int t; cin >> t;
		mm[t]++;
	}
	long long ans = 0;
	for (auto e : mm) {
		long long n = e.first;
		while (mm[n] != 0) {
			if (mm.count(n * x) != 0 && mm[n * x] != 0) {
				int rv = min(mm[n], mm[n * x]);
				mm[n] -= rv;
				mm[n * x] -= rv;
			}
			else {
				ans += mm[n];
				mm[n] = 0;
			}
		}
	}

	cout << ans << endl;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

 